package com.zkh.myutils.utils;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 枚举类工具类
 */
public class EnumUtils {
	
	/**
	 * 获取枚举类名称数组
	 * @param enumClass 枚举类Class
	 * @return 枚举类名称数组
	 */
	public static List<String> getNames(Class<?> enumClass) {
		return Stream.of(enumClass.getEnumConstants()).map(Object::toString).collect(Collectors.toList());

	}
	
	/**
	 * 获取枚举类指定字段的值数组
	 * @param enumClass 枚举类Class
	 * @param fieldGetter 枚举类字段Getter
	 * @return 枚举类指定字段的值数组
	 */
	public static <R, T> List<T> getFieldValues(Class<R> enumClass, Function<R, T> fieldGetter){
		return Stream.of(enumClass.getEnumConstants()).map(fieldGetter).collect(Collectors.toList());
	}
	
	/**
	 * 枚举值转Map
	 * @param enumClass 枚举值Class
	 * @param keyFieldGetter Map键获取方法
	 * @param valueFieldGetter Map值获取方法
	 */
	public static <R, S, T> Map<S, T> getMap(Class<R> enumClass, Function<R, S> keyFieldGetter, Function<R, T> valueFieldGetter){
		return Stream.of(enumClass.getEnumConstants()).collect(Collectors.toMap(keyFieldGetter, valueFieldGetter));
	}
	
	/**
	 * 根据指定值获取枚举对象
	 * @param enumClass 枚举值Class
	 * @param fieldGetter 获取枚举类指定值的Getter
	 * @param fieldValue 待比较的值
	 * @return
	 */
	public static <R, T> R getEnumBy(Class<R> enumClass, Function<R, T> fieldGetter, T fieldValue) {
		return Stream.of(enumClass.getEnumConstants()).filter(e->fieldGetter.apply(e).equals(fieldValue)).findFirst().orElse(null);
	}
	
	/**
	 * 根据指定值获取枚举类的其它属性值
	 * @param enumClass 枚举值Class
	 * @param fieldGetter 获取枚举类指定值的Getter
	 * @param fieldValue 指定枚举类某个属性的值
	 * @param fieldGetter2  获取枚举类其它值的Getter
	 * @return
	 */
	public static <R, S, T> S getFieldValueBy(Class<R> enumClass, Function<R, T> fieldGetter, T fieldValue, Function<R, S> fieldGetter2){
		//获取枚举类
		R r = getEnumBy(enumClass, fieldGetter, fieldValue);
		//获取值
		return r==null ? null : fieldGetter2.apply(r);
	}
}
